package com.asa.physics;

import com.asa.hutils.MathHUtils;
import com.asa.hutils.Ni;
import com.asa.physics.bean.Point;
import com.asa.physics.bean.ShiLiang;

/**
 * 坐标变换
 * @author Administrator
 *
 */
public class NormTransform {


	/**
	 *  平面点仿射变换
	 * 
	 * 未测试
	 * @param x0	新坐标原点，在原坐标的坐标
	 * @param y0	新坐标原点，在原坐标的坐标
	 * @param a	基向量
	 * @param x	老坐标在老坐标系的坐标
	 * @param y	老坐标在老坐标系的坐标
	 * @return	新坐标在行坐标系的坐标
	 */
	public static double[] point2Dchange(double x0,double y0,
			double[][] a,double x,double y) {
		double[] result = new double[2];
		double d = Ni.hangleishivalue(a);
		
		if (d!=0) {
			double[][] aa = new double[2][2];
			double[][] ab = new double[2][2];
			aa[0][0] = x-x0;
			aa[1][0] = y-y0;
			aa[0][1] = a[0][1];
			aa[1][1] = a[1][1];
			
			ab[0][0] = a[0][0];
			ab[1][0] = a[1][0];
			ab[0][1] = x-x0;
			ab[1][1] = y-y0;
			
			
			result[0] = Ni.hangleishivalue(aa)/d;	
			result[1] = Ni.hangleishivalue(ab)/d;
			
			
			return result;		
		}
		
		return null;
	}
	
	/**
	 * 平面向量仿射变换
	 * 
	 * 未测试
	 */
	public static double[] xiangliang2Dchange() {
		
		
		
		
		return null;
		
	}
	
	/**
	 * 任意的N维空间的仿射
	 * @param xzy0
	 * @param a
	 * @param xyz
	 * @return
	 */
	public static double[] pointNDchange(double[] xzy0,
			double[][] a,double[] xyz) {
		double[] result = new double[xzy0.length];
		double d = Ni.hangleishivalue(a);
		
		if (d!=0) {
			
			double[][] ni = Ni.getNi(a);
			double[][] asa = new double[xzy0.length][];
			for (int i = 0; i < asa.length; i++) {
				asa[i][0] = xyz[i] - xzy0[i];
			}
			
			
			double[][] chenfa = MathHUtils.chenfa(ni, asa);
			
			for (int i = 0; i < result.length; i++) {
				result[i] = chenfa[0][i];
			}
			
			
			return result;		
		}
		
		return null;
	}
	
	/**
	 * 角度旋转
	 * @param x0
	 * @param y0
	 * @param sigle
	 * @param x
	 * @param y
	 * @return
	 */
	public static double[] point2DchangewithSingle(double x0,double y0,
			double sigle,double x,double y) {
		
		double[][] a = new double[2][2];
		
		a[0][0] = Math.cos(sigle);
		a[0][1] = -Math.sin(sigle);
		a[1][0] = Math.sin(sigle);
		a[1][1] = Math.cos(sigle);

		return point2Dchange(x0, y0, a, x, y);
		
		
	}

	
}
